package org.example.service;


import org.example.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * @Component注解如果不起名称，会有一个默认值就是当前类名首字母小写，所以也可以按照名称获取
 *  BookDaoService bookDaoService = (BookDaoService) ctx.getBean("bookDaoServiceImpl");
 * 交给Spring框架管理
 */
@Service
public class BookDaoServiceImpl implements BookDaoService{

    /**
     * - @Autowired可以写在属性上，也可也写在setter方法上，最简单的处理方式是`写在属性上并将setter方法删除掉`
     * - 为什么setter方法可以删除呢?
     *    - 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
     *    - 普通反射只能获取public修饰的内容
     *    - 暴力反射除了获取public修饰的内容还可以获取private修改的内容
     *    - 所以此处无需提供setter方法
     *     @Autowired：注入引用类型，自动装配模式，默认按类型装配
     *     @Qualifier：自动装配bean时按bean名称装配
     */

    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
